﻿using DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Descripción breve de ModUFV
/// </summary>
public class ModUFV
{
    private lqDataContext data;
    public ModUFV()
    {
        data = new lqDataContext();
    }
    public List<Tbl_UFVs> listAllUFV()
    {
        var ufv = from per in data.Tbl_UFVs
                  where per.iEstado_fl == true
                  orderby per.dtFecha descending
                  select per;
        return ufv.ToList();
    }
    public Tbl_UFVs getUFV(String d)
    {

        DateTime date = Convert.ToDateTime(d);
        var ufv = from per in data.Tbl_UFVs
                  where per.iEstado_fl == true && per.dtFecha.Year == date.Year && per.dtFecha.Month == date.Month && per.dtFecha.Day == date.Day
                  select per;
        if (ufv.ToList().Count() > 0)
        {
            return ufv.ToList().ElementAt(0);
        }
        return null;
    }

    public List<Tbl_UFVs> getUFVporMes(String d)
    {

        DateTime date = Convert.ToDateTime(d);
        var ufv = from per in data.Tbl_UFVs
                  where per.iEstado_fl == true && per.dtFecha.Year == date.Year && per.dtFecha.Month == date.Month
                  select per;
        return ufv.ToList();
    }
    public bool checkUFVdeldia(String d)
    {

        DateTime date = Convert.ToDateTime(d);
        var ufv = from per in data.Tbl_UFVs
                  where per.iEstado_fl == true && per.dtFecha.Year == date.Year && per.dtFecha.Month == date.Month && per.dtFecha.Day == date.Day
                  select per;
        ufv.ToList().Count();
        if (ufv.ToList().Count() > 0)
        {
            return true;
        }
        return false;
    }
    public bool insertUFV(Tbl_UFVs p)
    {
        bool x=checkUFVdeldia(p.dtFecha.ToString());
        if (!x)
        {
            data.Tbl_UFVs.InsertOnSubmit(p);
            try
            {
                data.SubmitChanges();
                Console.WriteLine("inserto!!!");
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                data.SubmitChanges();
                return false;
            }
        }
        return false;
    }
    //codigo para revisar si afecta alguna consolidacion
    public bool checkhabilitadoCambio(String fecha)
    {
        DateTime date = Convert.ToDateTime(fecha);
        var afectados = from per in data.Tbl_HistorialDepreciacion
                        where per.iEstado_fl == true && per.dtFechaDesprecActual == date && per.iConsolidado_ft == true
                        select per;
        var afectados2 = from per in data.Tbl_HistorialDepreciacion
                        where per.iEstado_fl == true && per.dtFechaDesprecAnterior == date && per.iConsolidado_ft == true
                        select per;
        if (afectados.ToList().Count() > 0 || afectados2.ToList().Count() > 0)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    public void updateUFV(Tbl_UFVs uf)
    {
        try
        {
            Tbl_UFVs update = data.Tbl_UFVs.Single(x => x.iUfv_id == uf.iUfv_id);
            if (update.iConcurrencia == uf.iConcurrencia)
            {
                update.iConcurrencia = uf.iConcurrencia + 1;
                update.iValor=uf.iValor;
                update.iCreadoPor = uf.iCreadoPor;
                data.SubmitChanges();

            }
            else
            {
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            data.SubmitChanges();
        }
    }
    //devuelve la lista de los activos depreciados pero no consolidados
    public List<Tbl_HistorialDepreciacion> Afectados(String fecha)
    {
        DateTime date = Convert.ToDateTime(fecha);
        var afectados = from per in data.Tbl_HistorialDepreciacion
                        where per.iEstado_fl == true && per.dtFechaDesprecActual == date && per.iConsolidado_ft==false
                        select per;
        return afectados.ToList();
    }
    private String convertirFecha(DateTime d)
    {
        String fecha = d.Day + "/" + d.Month + "/" + d.Year;
        return fecha;
    }
    public List<String> listUfvFaltantes(List<Tbl_ActivoFijos> x, String fecha)
    {
        DateTime date = Convert.ToDateTime(fecha);
        List<String> faltantes = new List<String>();
        for (int i = 0; i < x.Count(); i++)
        {
            DateTime fechaVerificando = x.ElementAt(i).dtFecha_UltimaDepreciacion;
            DateTime fechainicial = x.ElementAt(i).dtFecha_ingreso;
            int j = 1;
            DateTime fechatest=fechaVerificando.AddMonths(j);
            if (fechainicial.Day == 31 && fechaVerificando.Day == 30)
            {
                fechatest = fechatest.AddDays(1);
            }
            else if (fechainicial.Day == 31 && fechaVerificando.Day == 28) 
            {
                fechatest = fechatest.AddDays(3);
            }
            else if (fechainicial.Day == 31 && fechaVerificando.Day == 29)
            {
                fechatest = fechatest.AddDays(2);
            }
            else if (fechainicial.Day == 30 && fechaVerificando.Day == 28)
            {
                fechatest = fechatest.AddDays(2);
            }
            else if (fechainicial.Day == 30 && fechaVerificando.Day == 29)
            {
                fechatest = fechatest.AddDays(1);
            }

            while (fechatest < date)
            {
                var update = from per in data.Tbl_UFVs
                             where per.iEstado_fl == true && per.dtFecha.Year == fechatest.Year && per.dtFecha.Month == fechatest.Month && per.dtFecha.Day == fechatest.Day
                             select per;
                if (update.ToList().Count() == 0)
                {
                    String nuevafecha = fechatest.Day + "/" + fechatest.Month + "/" + fechatest.Year;
                    if (!faltantes.Contains(nuevafecha))
                    {
                        faltantes.Add(nuevafecha);
                    }
                }
                j++;
                fechatest = fechaVerificando.AddMonths(j);
            }
        }
        return faltantes;
    }
}